Or 연산을 피한다 :: 오라클 실습[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

오라클 실습
[1]
등록일:2009-05-28 00:01:59 (0%)
작성자:
제목:Or 연산을 피한다
SQL은  구사하는  방법과  기능에  따라  시스템의  전체  성능에  지대한  영향을  미칠  수  있으므로  SQL문을  작성
하기  전에  항상  튜닝된  SQL만  사용해야  한다.  SQL을  작성한  후  프로그램에  내장하기  전에  항상  Execution  Plan이  어떻게  전개되는가를  먼저  살펴보아야  한다.  
  SQL사용에  있어서  사례별로  올바른  방법을  가이드하기  위하여  작성된  것이다.  그러나  모든  사용  유형에  대해서는  정리  할  수  없기  때문에  일반적으로  잘못  사용되고  있는  유형에  대하여  가이드  하였고,  유형별로  나눌수  있는  것은  SQL사용  사례를  가지고    올바른  SQL사용법을  정리해  놓았다.    
  
  
1.  SQL  성능향상  가이드
  Or연산을  피한다.
어떤  경우  SQL문장에  Or연산자가  들어가면  인덱스를  사용하지  못하는  경우가  있다.  이런경우  두가지  방법으로  다시  SQL문장을  쓴다.  하나는  In연산자를  사용하는  방법이고,  하나는  Union연산자를  사용하는  방법이다.

SELECT    a,거래분류코드,  a.sum(전표매수),  a.sum(건수),  a.sum(금액)
    FROM    조작자일별상세원장  a
WHERE      a.국기호  =  :입력국기호
      AND      a.거래일자  =  :입력거래일자
      AND      a.조작자번호  =  :입력조작자번호
      AND  (  a.과목코드  =  ‘1’  or  a.과목코드  =  ‘2’)
      GROUP  BY    a.거래분류코드;

<개선안1>
SELECT    a,거래분류코드,  a.sum(전표매수),  a.sum(건수),  a.sum(금액)
    FROM    조작자일별상세원장  a
WHERE      a.국기호  =  :입력국기호
        AND      a.거래일자  =  :입력거래일자
        AND      a.조작자번호  =  :입력조작자번호
        AND      a.과목코드  IN  (‘1’,  ’2’)
        AND      GROUP  BY    a.거래분류코드;

<개선안2>
SELECT    a,거래분류코드,  a.sum(전표매수),  a.sum(건수),  a.sum(금액)
    FROM    조작자일별상세원장  a
WHERE      a.국기호  =  :입력국기호
      AND      a.거래일자  =  :입력거래일자
      AND      a.조작자번호  =  :입력조작자번호
      AND      a.과목코드  =  ‘1’
      GROUP  BY    a.거래분류코드;
UNION  ALL
SELECT    a,거래분류코드,  a.sum(전표매수),  a.sum(건수),  a.sum(금액)
    FROM    조작자일별상세원장  a
WHERE      a.국기호  =  :입력국기호
      AND      a.거래일자  =  :입력거래일자
      AND      a.조작자번호  =  :입력조작자번호
      AND      a.과목코드  =  ’2’
      GROUP  BY    a.거래분류코드;

<개선안3>
Oracle7.2이상에서는  --+Use_Concat라는  힌트를  주면  Or를  해도  Full-Scan을  하지  않기  때문에  힌트를  사용하여  다음과  같이  나타낼  수  있다.
SELECT    /*+  Use_Concat  */  a,거래분류코드,  a.sum(전표매수),  a.sum(건수),  a.sum(금액)
    FROM    조작자일별상세원장  a
WHERE      a.국기호  =  :입력국기호
      AND      a.거래일자  =  :입력거래일자
      AND      a.조작자번호  =  :입력조작자번호
      AND  (  a.과목코드  =  ‘1’  or  a.과목코드  =  ‘2’)
      GROUP  BY    a.거래분류코드;
[본문링크] Or 연산을 피한다
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=31476
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.